#include <stdio.h>
#include<string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

// //getpid函数
// int main()
// {
//     while (1)
//     {
//         printf("I am process, pid is : %d, ppid is : %d\n", getppid(), getppid());
//         sleep(1);
//     }
//     return 0;
// }

// 认识fork
//  int main()
//  {
//      fork();
//      while (1)
//      {
//          printf("I am %d, my father is %d\n", getpid(), getppid());
//          sleep(1);
//      }
//      return 0;
//  }

// int main()
// {
//     printf("I am running\n");
//     pid_t id = fork();
//     if (id == 0)
//     {
//         // 子进程
//         while (1)
//         {
//             printf("I am child, my pid is: %d\n", getpid());
//             //printf("my father is: %d\n", getppid());
//             sleep(1);
//         }
//     }
//     else if (id > 0)
//     {
//         // 父进程
//         while (1)
//         {
//             printf("I am father, my pid is : %d\n", getpid());
//             sleep(1);
//         }
//     }
//     else
//     {
//         printf("error !\n");
//     }

//     return 0;
// }

//浅度睡眠态
// int main()
// {
//     printf("I am running\n");
//     sleep(1000);
//     return 0;
// }


// //僵尸进程
// int main()
// {
//     printf("I am running ...\n");
//     pid_t t = fork();
//     if(t == 0)
//     {
//         //子进程
//         int count = 5;
//         while(count--)
//         {
//             printf("I am child, pid is: %d, ppid is: %d, count is: %d\n", getpid(), getppid(), count);
//             sleep(1);
//         }
//         printf("I am child, I exit !!!!!!\n");
//         exit(1);
//     }
//     else if(t > 0)
//     {
//         while(1)
//         {
//             printf("I am father, pid is: %d, ppid is: %d\n", getpid(), getppid());
//             sleep(1);
//         }
//     }
//     else{
//         //错误
//     }

//     return 0;
// }

// //孤儿进程
// int main()
// {
//     printf("I am running...\n");
//     pid_t t = fork();
//     if(t  == 0)
//     {
//         //子进程
//         int count = 10;
//         while(count--)
//         {
//             printf("I am child, pid is: %d, ppid is: %d, count is: %d\n", getpid(), getppid(), count);
//             sleep(1);
//         }
//     }
//     else if(t > 0)
//     {
//         //父进程
//         int count = 5;
//         while(count--)
//         {
//             printf("I am father, pid is: %d, ppid is: %d\n", getpid(), getppid());
//              sleep(1);
//         }
//         printf("I am father, I exit!!!!!!\n");
//         exit(0);
//     }
//     else{
//         //错误
//     }
//     return 0;
// }

//展示C语言的进程退出码
// int main()
// {
//     int i = 0;
//     for(; i < 150; i++)
//     {
//         printf("error is %d: %s\n", i, strerror(i));
//     }
//     return 0;
// }

//_exit退出进程
// void show()
// {
//     //打印一行数据，不换行，数据留在缓冲区
//     printf("I am here !!!!");
//     _exit(2);
// }

// int main()
// {
//     show();
//     return 0;
// }
// 认识fork的返回值
// int main()
// {
//     int ret = fork();
//     if(ret == 0)
//         printf("i am a process:%d\n", getpid());
//     else
//         printf("i am a process:%d\n", getpid());
//     return 0;
// }

// 认识进程状态

// //wait函数
//  int main()
//  {
//      int id = fork();
//      if(id == 0)
//      {
//         //child
//          int count = 10;
//          while(count--)
//          {
//              printf("I am child... PID is: %d, PPID is : %d\n", getpid(), getppid());
//              sleep(1);
//          }
//          exit(0); //子进程退出
//      }

//     //father
//      //while :; do ps axj | head -1 && ps axj | grep test | grep -v grep;echo "######################";sleep 1;done

//     int status = 0;
//     pid_t ret = wait(&status);
//     if(ret > 0)
//     {
//         //等待成功
//         printf("wait success,the proccess is %d\n", ret);
//         if(WIFEXITED(status)){
//             printf("exit code is : %d\n", WEXITSTATUS(status));
//         }
//     }
//     sleep(3);
//     return 0;
// }




// // waitpid函数
// int main()
// {
// 	pid_t id = fork();
// 	if (id == 0){
// 		//child          
// 		int count = 10;
// 		while (count--){
// 			printf("I am child...PID:%d, PPID:%d\n", getpid(), getppid());
// 			sleep(1);
// 		}
// 		exit(0);
// 	}
// 	//father           
// 	int status = 0;
// 	pid_t ret = waitpid(id, &status, 0);
// 	if (ret >= 0){
// 		//wait success                    
// 		printf("wait child success...\n");
// 		if (WIFEXITED(status)){
// 			//exit normal                                 
// 			printf("exit code:%d\n", WEXITSTATUS(status));
// 		}
// 		else{
// 			//signal killed                              
// 			printf("killed by siganl %d\n", status & 0x7F);
// 		}
// 	}
// 	sleep(3);
// 	return 0;
// }

//非阻塞的轮询检测方案

// int main()
// {
//     pid_t id = fork();
//     if(id == 0)
//     {
//         //child
//         int count = 3;
//         while(count--)
//         {
//             printf("I am child...PID:%d, PPID:%d\n", getpid(), getppid());
//             sleep(2);
//         }
//         //printf("bye bye\n");
//         exit(0);
//     }

//     //father
//     while(1)
//     {
//         int status = 0;
//         //等待所有子进程，等待结束则返回pid，未结束时返回0，父进程则做自己的事
//         pid_t ret = waitpid(id, &status, WNOHANG);
//         if(ret > 0)
//         {
//             printf("wait success...\n");
//             printf("exit code is %d\n", WEXITSTATUS(status));
//             break;
//         }
//         else if(ret == 0)
//         {
//             printf("father do other thing\n");
//             sleep(1);
//         }
//         else{
//             printf("error !!!!\n");
//             break;
//         }
//     }
//     return 0;
// }

// //进程替换,认识exec函数，l表示list列表，e表示自动配置环境变量，p表示自动设置路径，v表示数组传参
// int main()
// {
//     printf("hello, I am running!!\n");
//     execl("/usr/bin/ls", "ls", "-a", "-i", NULL);
//     printf("bye, bye\n");
//     return 0;
// }

// int main()
// {
//     int count = 5;
//     while(count--)
//     {
//         printf("hello\n");
//         sleep(1);
//     }
//     //export PATH=$PATH:/home/study/linux-study/Review3-course
//     return 0;
// }


// int main(int argc, char *argv[], char *envp[])
// {
//     if(argc > 1)
//     {
//         if(strcmp(argv[1], "-a") == 0)
//         {
//             printf("you used -a option...\n");
//         }
//         else if(strcmp(argv[1], "-b") == 0)
//         {
//             printf("you used -b option...\n");
//         }
//         else
//         {
//             printf("you used -c option...\n");
//         }
//     }
//     else{
//         printf("请选择选项\n");
//     }
//     return 0;
// }

int main(int argc, char *argv[], char *envp[])
{
    int i = 0;
    while(i <= 8)
    {
        printf("envp[%d] is %s\n",i, envp[i++]);
    }
    return 0;
}